import pysvn

###############################################################################

class SvnController:
    

    def __init__( self ):
        self.client = pysvn.Client()
        self.client.exception_style = 1
        self.client.commit_info_style = 1
        self.client.callback_get_login = self.callbackGetLogin
        self.client.callback_cancel = self.callbackCancel
        self.client.callback_notify = self.callbackNotify   
        self.client.set_default_username( '' )
        self.client.set_default_password( '' )
        self.loginAttempts = 0
        self.wsRevision = -1


###############################################################################


    def callbackNotify( self, event ):        
        if ( event['action'] == pysvn.wc_notify_action.update_completed ):
            self.wcRevision = event['revision'].number
    

###############################################################################

    
    def callbackCancel( self ):
        if ( self.loginAttempts > 1 ):
            return True
        else:
            return False


###############################################################################


    def callbackGetLogin( self, realm, username, may_save ):
        self.loginAttempts += 1
        return 1, self.client.get_default_username(), self.client.get_default_password(), False


###############################################################################

    
    def setUsername( self, username ):
        self.client.set_default_username( username )
        self.loginAttempts = 0


###############################################################################

        
    def setPassword( self, password ):
        self.client.set_default_password( password )
        self.loginAttempts = 0
        

###############################################################################


    def checkURL( self, url ):
        try:
            
            entry = self.client.info2( url,
                                       pysvn.Revision( pysvn.opt_revision_kind.head ),
                                       pysvn.Revision( pysvn.opt_revision_kind.unspecified ),
                                       False )
            self.loginAttempts = 0

        except pysvn.ClientError as e:
            print( e.args[0] )
            return False

        return True


###############################################################################


    def checkWorkingCopy( self, path ):
        try:
            
            entry = self.client.info2( path )

        except pysvn.ClientError as e:
            print( e.args[0] )
            return False

        return True
    

###############################################################################


    def getHeadRevision( self, url ):
        try:
            
             entry = self.client.info2( url,
                                        pysvn.Revision( pysvn.opt_revision_kind.head ),
                                        pysvn.Revision( pysvn.opt_revision_kind.unspecified ),
                                        False )
             self.loginAttempts = 0

        except pysvn.ClientError as e:
            print( e.args[0] )
            return -1
        
        if ( len( entry ) == 0 ):
            return -1
        
        return entry[0][1].rev.number


###############################################################################


    def checkout( self, url, path ):
        try:
            
             revision = self.client.checkout( url, path )
             self.loginAttempts = 0

        except pysvn.ClientError as e:
            print( e.args[0] )
            return -1

        return self.wcRevision
    

###############################################################################


    def update( self, path ):
        try:
            
             revision = self.client.update( path )
             self.loginAttempts = 0

        except pysvn.ClientError as e:
            print( e.args[0] )
            return -1

        return self.wcRevision


###############################################################################
    